package com.dbdata.move.service;

import com.dbdata.move.PinYinTool;
import com.dbdata.move.Utils;
import com.dbdata.move.dao.StudentDao;
import com.dbdata.move.dao.UserDao;
import com.dbdata.move.model.*;
import com.wksc.commons.utils.date.DateUtils;
import com.wksc.commons.utils.string.StringUtils;
import opensource.jpinyin.PinyinFormat;
import opensource.jpinyin.PinyinHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Richard
 */
@Service
public class StudentService {

    private static final Logger L = LoggerFactory.getLogger(StudentService.class);

    @Autowired
    private StudentDao dao;
    @Autowired
    private UserDao userDao;

    @Autowired
    private AirLineService airLineService;
    @Autowired
    private StudentTypeService typeService;
    @Autowired
    private StudentClassService classService;

    private Pattern pattern = Pattern.compile("[a-zA-Z|.| ]+");

    /**
     * 保存学员信息
     * @param organizeId 组织机构id，id<=0，则使用原始数据的组织机构信息。id>0，则使用
     *                   指定的参数组织机构id
     * @throws ParseException
     */
    public void saveStudent(long organizeId) throws ParseException {
        String filePath = "F:\\backupfile\\44.txt";
        List<String> list = new ArrayList<String>();

        // 获取所有航空公司信息
        Map<String, Long> airLineMap = airLineService.getAirLineMap();
        // 获取所有学生类型
        Map<String, Long> stuTypeMap = typeService.getStuTypeAll();

        // 获取所有的期班
        Map<String, Long> clsMap = classService.getClassAll();

        try {
            list = Utils.readCsvFileNoHead(filePath, "utf-8");
        } catch (IOException e) {
            L.error("读取学员原始数据出错！", e);
        }

        for (String s : list) {
            String[] item = s.trim().split(",", -1);
            L.info("==========开始导入学员：{}===============", item[1].trim());

            UserBaseInfo baseInfo = new UserBaseInfo();
            if (userDao.findUserByIdentityCard(item[2].trim()).size() > 0) {
                L.warn("学员信息已存在，跳过！！");
                continue;
            }
            baseInfo.setUserName(item[1].trim());
            baseInfo.setSpell(PinYinTool.getPinYin(item[1].trim()));
            // 拼音缩写
            baseInfo.setPinYinSx(PinYinTool.getPinYinSX(item[1].trim()));
            baseInfo.setUserType((byte) 2);
            Matcher matcher = pattern.matcher(item[1]);
            if (matcher.matches()) {
                L.warn("外国籍学生：{}", item[1]);
                baseInfo.setPassport(item[2]);
            } else {
                String identityCard = StringUtils.defaultString(item[2]).trim().toUpperCase();
                baseInfo.setIdentityCard(identityCard);
                if (StringUtils.isNotBlank(identityCard)) {
                    boolean sex = Integer.parseInt(identityCard.substring(identityCard.length() - 2,
                            identityCard.length() - 1)) % 2 == 1;
                    baseInfo.setSex(sex);
                }
            }

            baseInfo.setAccountState((byte) 1);
            baseInfo.setCanTransform(true);
            Organize organize = new Organize();
            if (organizeId <= 0) {
                organize.setId(Utils.getOrganizeId(item[22].trim()));
            } else {
                organize.setId(organizeId);
            }

            baseInfo.setOrganize(organize);

            AirLine airLine = new AirLine();
            if (airLineMap.containsKey(item[7].trim())) {
                airLine.setId(airLineMap.get(item[7].trim()));
            } else {
                L.error("未从数据库找到匹配的航空公司信息：{}", item[7].trim());
                break;
            }

            StudentType studentType = new StudentType();
            if (stuTypeMap.containsKey(item[8].trim())) {
                studentType.setId(stuTypeMap.get(item[8].trim()));
            } else {
                L.warn("未从数据库找到匹配的学员类型：{},使用默认的“其他”类型", item[8].trim());
                studentType.setId(stuTypeMap.get("其他"));
            }

            // 班级
            String cls = item[15].trim();
            // 小班
            String childCls = item[16].trim();

            StudentClass studentClass = new StudentClass();
            studentClass.setId(clsId(cls, clsMap));

            Student student = new Student();

            student.setUserBaseInfo(baseInfo);
            student.setAirLine(airLine);
            student.setStudentClass(studentClass);
            student.setChildClass(childCls);
            student.setStudentType(studentType);
            // 学号
            student.setNumber(item[6].trim());

            if (!StringUtils.isEmpty(item[14].trim())) {
                // 体检合格时间
                student.setQualifiedDate(DateUtils.stringToDate(item[14].trim(),
                        "yyyy/MM/dd"));
            }
            if (!StringUtils.isEmpty(item[9].trim())) {
                // 入校时间
                student.setInDate(DateUtils.stringToDate(item[9].trim(), "yyyy"));
            }
            if (!StringUtils.isEmpty(item[10].trim())) {
                // 离校时间
                student.setOutDate(DateUtils.stringToDate(item[10].trim(), "yyyy"));
            }
            // 全英语教学
            if (!StringUtils.isEmpty(item[54].trim())) {
                student.setEnglishOnly(Boolean.valueOf(item[54].trim().toLowerCase()));
            } else { // 默认为false
                student.setEnglishOnly(false);
            }

            // MPL教学
            if (StringUtils.isEmpty(item[18].trim())) {
                student.setMplStudent(false);
            } else {
                if (item[18].trim().contains("43") || item[18].trim().contains("74")) {
                    student.setMplStudent(true);
                } else {
                    student.setMplStudent(false);
                }
            }

            dao.save(student);
            L.info("==============END==============");
        }

    }

    /**
     * 获取期班id
     *
     * @param cls    班级名称
     * @param clsMap 班级数据（来自于数据库student_class表）
     * @return 班级id
     */
    private Long clsId(String cls, Map<String, Long> clsMap) {

        // 班级为空，则使用默认的“其他”班级
        if (StringUtils.isEmpty(cls)) {
            L.warn("期班信息为空！使用默认班级'其他'");
            return clsMap.get("其他");
        }
        // 原始数据的期班信息在最新的期班表不存在
        if (!clsMap.containsKey(cls)) {
            L.error("原始数据的期班信息：{}，在最新的期班表不存在！！", cls);
            return null;
        }
        return clsMap.get(cls);
    }
}
